#!/usr/bin/env python
# encoding: utf-8

# @Author  : vfengcc
# @File    : tools.py
# @Time    : 2020/2/29 00:34

import datetime
import functools
import random
import time

'''
第七周作业(2.17-3.1)
1. 请设计一个decorator，它可作用于任何函数上，并打印该函数的执行时间
2. 请设计一个decorator，它可作用于任何函数上，要求可以接受一个int作为参数，如果该函数的执行时间大于int传递的时间话，请打印改函数名字和执行时间
'''


def cost_time_v1(fn):
    ''' 1. 请设计一个decorator，它可作用于任何函数上，并打印该函数的执行时间 '''

    @functools.wraps(fn)
    def wrapper(*args, **kwargs):
        start = datetime.datetime.now()
        ret = fn(*args, **kwargs)
        delta = (datetime.datetime.now() - start).total_seconds()
        print('fn-{} 执行时间: {}s'.format(fn.__name__, delta))
        return ret

    return wrapper


def cost_time_v2(duration=10):
    ''' 2. 请设计一个decorator，它可作用于任何函数上，要求可以接受一个int作为参数，如果该函数的执行时间大于int传递的时间话，请打印改函数名字和执行时间 '''

    def wrapper(fn):
        @functools.wraps(fn)
        def inner(*args, **kwargs):
            start = datetime.datetime.now()
            ret = fn(*args, **kwargs)
            delta = (datetime.datetime.now() - start).total_seconds()
            if delta > duration:
                print('fn-{} 执行时间: {}s, 超过了警戒值{}s'.format(fn.__name__, delta, duration))
            return ret

        return inner

    return wrapper


@cost_time_v1
def my_sum():
    time.sleep(random.randint(1, 100) / 100)


@cost_time_v2(duration=0.5)
def my_reduce():
    time.sleep(random.randint(1, 100) / 100)


if __name__ == '__main__':
    print('===测试1===')
    my_sum()
    print('\n===测试2===')
    my_reduce()
    print('\n执行完毕!')
